home *** CD-ROM | disk | FTP | other *** search
- *cN Low Level (II)
- *cG
- Seguro que alguna vez has visto una pequeña demo que se incluye junto a un
- montón de programas y que es la marca inconfundible de que ese fichero ha sido
- extraido de la*cO BBS BlasterSound*cG. Por si no lo has visto (o no lo recuerdas),
- se trata de una intro donde van apareciendo los típicos mensajes de la BBS a
- la vez que está nevando (virtualmente, claro).
- El efecto es sensacional ya que usa un modo gráfico de 640x400 (más o menos)
- y los copos de nieve no caen como piedras, sino que se dejan llevar. En este
- número aprenderemos a hacer este bonito efecto con el modo 13h y cargando un
- fichero RAW en pantalla para ver mejor como se amontonan los copos.
- El código fuente lo encontrareis en el directorio 'lowlevel' y está pensado
- para usarse con el*cO Turbo Assembler v1.0 *cGasí que seguro que lo puedes ensamblar
- con cualquier otro. Usa las directivas simplificadas y está pensado para ser
- un archivo COM (el fichero que encontrarás ya compilado está comprimido con el
- *cOPK-LITE*cG para ocupar menos).
- La primera función que nos encontramos es la típica Wait for Vertical
- Retrace que espera, como su nombre indica, el próximo retrazado vertical de
- la tarjeta de video. Esto nos servirá para dos cosas: primero para sincronizar
- la velocidad del programa con la tarjeta (un retrazado se produce cada 1/70
- segundos); y luego para que no se produzca el desagradable efecto que vemos
- en los malos juegos cuando salen sprites, el parpadeo de la imagen.
- *cJ
- WaitVR PROC NEAR
- PUSH DX ; Preserva los registros.
- PUSH AX
- MOV DX, 03DAh
- @@St1: IN AL, DX ; Espera a que termine el retrazo.
- TEST AL, 08h
- JZ @@St1
- @@St2: IN AL, DX ; Espera a que empieze el nuevo.
- TEST AL, 08h
- JNZ @@St2
- POP AX
- POP DX
- RET
- WaitVR ENDP
- *cG
- Otra función interesante es *cCRandom*cG. Se encarga de proporcionarnos números
- pseudo-aleatorios a partir de 3 variables que modifica según unas reglas
- matemáticas (escogidas de forma totalmente aleatoria) y nos permite así que
- los copos no caigan uniformemente.
- *cJ
- Random PROC NEAR ; Hacemos unas cuantas tonterias
- MOV AX, CS:[Rand1] ; con los números para barajarlos lo
- ROL AX, 2 ; mejor posible.
- ADD AX, CS:[Rand2]
- SUB CS:[Rand1], AX
- ROR AX, 3
- XOR AX, CS:[Rand3]
- ADD CS:[Rand2], AX
- ROR AX, 1
- XOR CS:[Rand3], AX
- RET
- Random ENDP
- *cG
- El procedimiento principal se llama *cCnevada*cG y está sobradamente comentado
- y el *cCmain*cG no hace falta ni eso ya que sólo se encarga de ir llamando a las
- funciones de inicialización y luego llama a *cCnevada*cG. Seguramente os llamará
- la atención el hecho de que se dibujen dos líneas verticales a los lados de
- la pantalla en el *cCmain*cG; eso es para evitar que los copos que estén en los
- pixels donde *cOx=320*cG aparezcan por la siguiente línea (a la izquierda).
- *cL
- Navi Dj.
-
-